﻿/**
 * 表单验证工具类
 *
 * @author 李超
 * @version 1.0
 */

$(function() {
	initValidate();
	$(".requiredClaims").each(function() {
				var $this = $(this);
				$(this).html("<span class='required'>*</span>"
						+ $this.html());
			});
});

// 初始化页面验证
function initValidate() {
	var xOffset = -20; // x distance from mouse
	var yOffset = 20; // y distance from mouse

	// input action
	$("[reg],[url]:not([reg]),[tip],[valuelength]:not([reg],[url])").hover(
	function(e) {
		if ($(this).attr('tip') != undefined) {
			var top = (e.pageY + yOffset);
			var left = (e.pageX + xOffset);
			$('p#vtip').remove();
			$('body').append('<p id="vtip" style="font-size:12px;color:red;"><img id="vtipArrow" src="'
							+ '/MPRO/js/third/validator/css/vtip_arrow.png"/>'
							+ $(this).attr('tip') + '</p>');
			$('p#vtip').css("top", top + "px").css("left", left + "px");
//			$('p#vtip').bgiframe();
		}
	}, function() {
		if ($(this).attr('tip') != undefined) {
			$("p#vtip").remove();
		}
	}).mousemove(function(e) {
		if ($(this).attr('tip') != undefined) {
			var top = (e.pageY + yOffset);
			var left = (e.pageX + xOffset);
			$("p#vtip").css("top", top + "px").css("left", left + "px");
		}
	}).blur(function() {
		$("p#vtip").remove();
		validate_all($(this));
	});
};

// 初始化表单验证
function initValidateForm(id) {
	var xOffset = -20; // x distance from mouse
	var yOffset = 20; // y distance from mouse

	// input action
	$('#' + id).find("[reg],[url]:not([reg]),[tip],[valuelength]:not([reg],[url])").hover(function(e) {
		if ($(this).attr('tip') != undefined) {
			var top = (e.pageY + yOffset);
			var left = (e.pageX + xOffset);
			$('p#vtip').remove();
			$('body').append('<p id="vtip" style="font-size:12px;color:red;"><img id="vtipArrow" src="'
							+ '/MPRO/js/third/validator/css/vtip_arrow.png"/>'
							+ $(this).attr('tip') + '</p>');
			$('p#vtip').css("top", top + "px").css("left", left + "px");
//			$('p#vtip').bgiframe();
		}
	}, function() {
		if ($(this).attr('tip') != undefined) {
			$("p#vtip").remove();
		}
	}).mousemove(function(e) {
		if ($(this).attr('tip') != undefined) {
			var top = (e.pageY + yOffset);
			var left = (e.pageX + xOffset);
			$("p#vtip").css("top", top + "px").css("left", left + "px");
		}
	}).blur(function() {
		$("p#vtip").remove();
		validate_all($(this));
	});
};

// 初始化元素验证
function initValidateObject(id) {
	var xOffset = -20; // x distance from mouse
	var yOffset = 20; // y distance from mouse
	// input action
	$('#' + id).hover(function(e) {
		if ($(this).attr('tip') != undefined) {
			var top = (e.pageY + yOffset);
			var left = (e.pageX + xOffset);
			$('p#vtip').remove();
			$('body').append('<p id="vtip" style="font-size:12px;color:red;"><img id="vtipArrow" src="'
							+ '/MPRO/js/third/validator/css/vtip_arrow.png"/>'
							+ $(this).attr('tip') + '</p>');
			$('p#vtip').css("top", top + "px").css("left", left + "px");
//			$('p#vtip').bgiframe();
		}
	}, function() {
		if ($(this).attr('tip') != undefined) {
			$("p#vtip").remove();
		}
	}).mousemove(function(e) {
		if ($(this).attr('tip') != undefined) {
			var top = (e.pageY + yOffset);
			var left = (e.pageX + xOffset);
			$("p#vtip").css("top", top + "px").css("left", left + "px");
		}
	}).blur(function() {
		$("p#vtip").remove();
		validate_all($(this));
	});
}

/**
 * 触发单个元素验证
 *
 * @param {}
 *            obj
 */
function validate_object(id) {
	initValidateObject(id);
	return validate_all($('#' + id));
}

/**
 * 表单验证
 *
 * @param 表单id
 * @return true 验证通过，false 验证不通过
 *
 */
function validate_form(id) {
	initValidateForm(id);
	var isSubmit = true;
	$('#' + id).find("[reg],[url]:not([reg]),[valuelength]:not([reg],[url])").each(function() {
		if (!validate_all($(this))) {
			isSubmit = false;
		}
	});
	if (typeof(isExtendsValidate) != "undefined") {
		if (isSubmit && isExtendsValidate) {
			return extendsValidate();
		}
	}
	return isSubmit;
};

/**
 * 清空验证样式和提示信息
 *
 * @param 表单id
 */
function validate_clear(id) {
	$('#' + id).find("[reg],[url]:not([reg]),[valuelength]:not([reg],[url])").each(function() {
		var validate_obj_clear_id = $(this).attr('id');
		change_error_style($(this), "remove");
		$(this).next("img[id=" + validate_obj_clear_id + "_validateSuccess]").remove();
		//$('#' + validate_obj_clear_id + '_validateSuccess').remove();
		// $('#' + validate_obj_clear_id +
		// '_validateError').remove();
		$(this).removeAttr("tip");
	});
};

/**
 * 清空对象验证样式和提示信息
 *
 * @param 对象
 */
function validate_clear_obj_this(obj) {
	change_error_style($(obj), "remove");
	$(obj).next("img[id=" + $(obj).attr('id') + "_validateSuccess]").remove();
	$(obj).removeAttr("tip");
};

/**
 * 清空对象验证样式和提示信息
 *
 * @param 对象id
 */
function validate_clear_object(id) {
	change_error_style($('#' + id), "remove");
	$('#' + id + '_validateSuccess').remove();
	$('#' + id).removeAttr("tip");
};

/**
 * 清空对象验证样式和提示信息
 *
 * @param div或者table的ID
 */
function not_validate_div_table(id) {
	$('#' + id).find("[reg],[url]:not([reg]),[valuelength]:not([reg],[url])").each(function() {
		$(this).removeAttr("reg");
	});
};
function add_validate_div_table(id) {
	$('#' + id).find("[reg_temp],[url]:not([reg_temp]),[valuelength]:not([reg_temp],[url])").each(function() {
		$(this).attr("reg",$(this).attr("reg_temp"));
	});
};

/**
 * 执行所有验证方法
 *
 * @param obj
 */
function validate_all(obj) {
	if (validate_length(obj)) {
		if (validate(obj)) {
			if (ajax_validate(obj)) {
				return true;
			}
		}
	}
	return false;
};

/**
 * 验证函数
 *
 * @param {}
 *            obj
 * @return {Boolean}
 */
function validate(obj) {
	if (obj.attr("reg") == undefined) {
		change_error_style(obj, "remove");
		change_tip(obj, null, "remove");
		return true;
	} else {
		var reg = new RegExp(obj.attr("reg"));
		var objValue = obj.val();
		if (!reg.test(trim_quote(objValue))) {
			change_error_style(obj, "add");
			change_tip(obj, null, "add");
			return false;
		} else {
			change_error_style(obj, "remove");
			change_tip(obj, null, "remove");
			return true;
		}
	}
}

/**
 * ajax验证函数
 *
 * @param {}
 *            obj
 */
function ajax_validate(obj) {
	if (obj.attr("url") == undefined) {
		change_error_style(obj, "remove");
		change_tip(obj, null, "remove");
		return true;
	} else {
		var ajaxvalidateflag = false;
		var url_str = obj.attr("url");
		url_str = contextPath + url_str;
		var url_str_id = obj.attr("formid");
		var url_param_json = {};
		$(url_str_id.split(",")).each(function(i, n) {
			url_param_json = extendjson({}, [url_param_json, form2json(n)],true);
		});
		$.ajax({
			url : url_str,
			type : "POST",
			cache : false,
			async : false,
			dataType : "json",
			data : url_param_json,
			success : function(json) {
				feed_back = json.validatemsg;
				if (feed_back == 'success') {
					change_error_style(obj, "remove");
					change_tip(obj, null, "remove");
					ajaxvalidateflag = true;
				} else {
					change_error_style(obj, "add");
					change_tip(obj, feed_back, "add");
					ajaxvalidateflag = false;
				}
			},
			error : function(data) {
			    $._errormsg.error(data);
			}
		});
		return ajaxvalidateflag;
	}
}

/**
 * 验证字节长度
 *
 * @param {}
 *            obj
 * @return {Boolean}
 */
function validate_length(obj) {
	if (obj.attr("valuelength") == undefined) {
		change_error_style(obj, "remove");
		change_tip(obj, null, "remove");
		return true;
	} else {
		var objLength = obj.attr("valuelength");
		var objValue = obj.val();
		// GBK 数据库 汉字匹配2个字符
		// var newValue = objValue.replace(/[^\x00-\xff]/g, "**");
		// UTF-8 数据库 汉字匹配3个字符
		var newValue = objValue.replace(/[^\x00-\xff]/g, "***");
		var newLength = newValue.length;
		if (parseInt(newLength) > parseInt(objLength)) {
			change_error_style(obj, "add");
			change_tip(
					obj,
					"\u8F93\u5165\u7684\u5185\u5BB9\u4E0D\u80FD\u5927\u4E8E"
							// GBK 数据库 汉字匹配2个字符
							// + Math.floor(parseInt(objLength) / 2)
							// UTF-8 数据库 汉字匹配3个字符
							+ Math.floor(parseInt(objLength) / 3)
							+ "\u4E2A\u6C49\u5B57\u6216"
							+ objLength
							+ "\u4E2A\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u7B26\u53F7",
					"add");
			return false;
		} else {
			change_error_style(obj, "remove");
			change_tip(obj, null, "remove");
			return true;
		}
	}
}

/**
 * 变换提示信息
 *
 * @param {}
 *            obj
 * @param {}
 *            msg
 * @param {}
 *            action_type
 */
function change_tip(obj, msg, action_type) {
	// 初始化判断TIP是否为空
	if (obj.attr("tip") == undefined && obj.attr("tip_bak") == undefined) {
		obj.attr("is_tip_null", "yes");
	} else if (obj.attr("tip") != undefined && obj.attr("tip_bak") == undefined) {
		obj.attr("tip_bak", obj.attr("tip"));
	}
	if (action_type == "add") {
		if (obj.attr("is_tip_null") == "yes") {
			obj.attr("tip", msg);
		} else {
			if (msg != null) {
				obj.attr("tip", msg);
			} else {
				obj.attr("tip", obj.attr("tip_bak"));
			}
		}
	} else {
		if (obj.attr("is_tip_null") == "yes") {
			obj.removeAttr("tip");
			obj.removeAttr("tip_bak");
		} else {
			obj.removeAttr("tip");
		}
	}
}

/**
 * 变换错误提示样式
 *
 * @param {}
 *            obj
 * @param {}
 *            action_type
 */
function change_error_style(obj, action_type) {
	var validate_obj_id = $(obj).attr('id');
	if (action_type == "add") {
		obj.addClass("input_validation-failed");
//		if ($(obj).attr("date") != undefined) {
//			if ($(obj).attr("bordercolor") == undefined) {
//				$(obj).attr('bordercolor', $(obj).css("border-color"));
//			}
//			$(obj).css("border-color", "red");
//		}
		$(obj).next("img[id=" + validate_obj_id + "_validateSuccess]").remove();
		//$('#' + validate_obj_id + '_validateSuccess').remove();
		// $('#' + validate_obj_id + '_validateError').remove();
		// $(obj).after('<img id="' + validate_obj_id + '_validateError'
		// + '" src="' + contextPath
		// + '/styles/extends/validator/error.gif"/>');
	} else {
		obj.removeClass("input_validation-failed");
//		if ($(obj).attr("date") != undefined) {
//			if ($(obj).attr("bordercolor") != undefined) {
//				$(obj).css("border-color", $(obj).attr("bordercolor"));
//			}
//		}
		$(obj).next("img[id=" + validate_obj_id + "_validateSuccess]").remove();
		//$('#' + validate_obj_id + '_validateSuccess').remove();
		// $('#' + validate_obj_id + '_validateError').remove();
		if ($(obj).attr('viewflag') != 'no') {
			$(obj).after('<img id="' + validate_obj_id + '_validateSuccess'
					+ 'src="/MPRO/js/third/validator/css/success.gif"/>');
		}
	}
}

$.fn.validate_callback = function(msg, action_type, options) {
	this.each(function() {
				if (action_type == "failed") {
					change_error_style($(this), "add");
					change_tip($(this), msg, "add");
				} else {
					change_error_style($(this), "remove");
					change_tip($(this), null, "remove");
				}
			});
};

function extendjson(des, src, override) {
	if (src instanceof Array) {
		for (var i = 0, len = src.length; i < len; i++)
			extendjson(des, src[i], override);
	}
	for (var i in src) {
		if (override || !(i in des)) {
			des[i] = src[i];
		}
	}
	return des;
}

function trim_quote(str) {
	return trim(str).replace(/\\/g, '\\\\').replace(/\"/g, '\\\"').replace(
			/\r/g, '\\r').replace(/\n/g, '\\n').replace(/\t/g, '\\t').replace(
			/\f/g, '\\f');
}
